package dep
//
//import (
//	"archive/tar"
//	"compress/gzip"
//	"context"
//	"encoding/json"
//	"io"
//	"net/http"
//	"os"
//	"path/filepath"
//	"strconv"
//	"strings"
//
//	"gitee.com/go-errors/errors"
//	"github.com/krolaw/zipstream"
//	"github.com/ulikunitz/xz"
//	"github.com/valyala/fastjson"
//)
//
//type (
//	ProgressFunc = func(cur, total, pct int64)
//	ProcessFunc  = func(resp *http.Response) error
//	ReadFunc     = func(r io.Reader) error
//	JSONValue    = fastjson.Value
//	JSONObject   = fastjson.Object
//)
//
//func GetDownload(ctx context.Context, url string, processFn ProcessFunc) error {
//	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
//	if err != nil {
//		return err
//	}
//	resp, err := http.DefaultClient.Do(req)
//	if err != nil {
//		return err
//	}
//	return processFn(resp)
//}
//
//func Process(process ProcessFunc) ProcessFunc {
//	return func(resp *http.Response) (err error) {
//		defer func() {
//			if re := recover(); re != nil {
//				if ex, ok := re.(error); ok {
//					err = ex
//				} else {
//					err = errors.Errorf("%v", re)
//				}
//			}
//		}()
//		defer func(Body io.ReadCloser) { _ = Body.Close() }(resp.Body)
//		err = process(resp)
//		return
//	}
//}
//
//func ProcessBytes(process func(data []byte) error) ProcessFunc {
//	return Process(func(resp *http.Response) (err error) {
//		var data []byte
//		if data, err = io.ReadAll(resp.Body); err != nil {
//			return
//		}
//		err = process(data)
//		return
//	})
//}
//
//func ProcessJSON(v interface{}) ProcessFunc {
//	return ProcessBytes(func(data []byte) error { return json.Unmarshal(data, v) })
//}
//
//func ProcessProgress(read ReadFunc, progress ...ProgressFunc) ProcessFunc {
//	return Process(func(resp *http.Response) error {
//		total, _ := strconv.ParseInt(resp.Header.Get("Content-Length"), 10, 64)
//		return read(withProgress(resp.Body, total, progress...))
//	})
//}
//
//func ProcessZip(saveTo string, trimRoot bool, progress ...ProgressFunc) ProcessFunc {
//	return ProcessProgress(func(r io.Reader) error {
//		zr := zipstream.NewReader(r)
//		for h, err := zr.Next(); ; h, err = zr.Next() {
//			if err != nil {
//				if err == io.EOF {
//					break
//				}
//				return err
//			}
//			var (
//				target = getTargetPath(saveTo, h.Name, trimRoot)
//				fi     = h.FileInfo()
//			)
//			if fi.IsDir() {
//				err = os.MkdirAll(target, fi.Mode())
//			} else {
//				err = readTo(zr, target, fi.Mode())
//			}
//			if err != nil {
//				return err
//			}
//		}
//		return nil
//	}, progress...)
//}
//
//func processTar(saveTo string, trimRoot bool, getTar func(r io.Reader) (io.Reader, error), progress []ProgressFunc) ProcessFunc {
//	return ProcessProgress(func(r io.Reader) error {
//		defer func(r interface{}) {
//			if c, ok := r.(io.Closer); ok {
//				_ = c.Close()
//			}
//		}(r)
//
//		trd, err := getTar(r)
//		if err != nil {
//			return err
//		}
//		tr := tar.NewReader(trd)
//		for h, err := tr.Next(); ; h, err = tr.Next() {
//			if err != nil {
//				if err == io.EOF {
//					break
//				}
//				return err
//			}
//
//			target := getTargetPath(saveTo, h.Name, trimRoot)
//			if target == "" {
//				continue
//			}
//
//			if fi := h.FileInfo(); fi.IsDir() {
//				err = os.MkdirAll(target, fi.Mode())
//			} else {
//				err = readTo(tr, target, fi.Mode())
//			}
//			if err != nil {
//				return err
//			}
//		}
//		return nil
//	}, progress...)
//}
//
//func ProcessTxz(saveTo string, trimRoot bool, progress ...ProgressFunc) ProcessFunc {
//	return processTar(saveTo, trimRoot, func(r io.Reader) (io.Reader, error) {
//		return xz.NewReader(r)
//	}, progress)
//}
//
//func ProcessTgz(saveTo string, trimRoot bool, progress ...ProgressFunc) ProcessFunc {
//	return processTar(saveTo, trimRoot, func(r io.Reader) (io.Reader, error) {
//		return gzip.NewReader(r)
//	}, progress)
//}
//
//func ProcessJSONDocument(process func(jv *JSONValue) error) ProcessFunc {
//	return ProcessBytes(func(data []byte) error {
//		jv, err := fastjson.ParseBytes(data)
//		if err != nil {
//			return err
//		}
//		return process(jv)
//	})
//}
//
//func ProcessJSONArray(process func(values []*JSONValue) error) ProcessFunc {
//	return ProcessJSONDocument(func(jv *JSONValue) error {
//		values, err := jv.Array()
//		if err != nil {
//			return err
//		}
//		return process(values)
//	})
//}
//
//var separator = string(filepath.Separator)
//var repl = strings.NewReplacer("/", separator, "\\", separator)
//
//func getTargetPath(targetDIR, name string, trimRoot bool) string {
//	name = strings.Trim(repl.Replace(name), separator)
//	if trimRoot {
//		if index := strings.Index(name, separator); index != -1 {
//			name = name[index+len(separator):]
//		} else {
//			name = ""
//		}
//	}
//	if name == "" {
//		return ""
//	}
//	return filepath.Join(targetDIR, name)
//}
